1. Обмен значениями переменных с помощью буфера обмена, рекуррентных формул и кортежей.
(Лекция 1)
# Вариант 1: Буфер обмена
x, y = 3, 5
buf = x
x = y
y = buf
# Вариант 2: Рекуррентные формулы
x, y = 3, 5
x = x + y # x=8
y = x - y # y=3
x = x - y # x=5
# Вариант 3: Кортежи (Pythonic way)
x, y = 3, 5
x, y = y, x
2. Задача про треугольник (составные условия vs списки/множества vs itertools/кванторы).
Заданы три отрезка a, b, c. Существует ли треугольник? Какой тип (равносторонний, равнобедренный, разносторонний)?
(Лекция 1)
# Вариант 1: Составные условия (if/and/or)
if a + b > c and a + c > b and b + c > a:
print("Существует")
if a == b == c:
print("Равносторонний")
elif a == b or a == c or b == c:
print("Равнобедренный")
else:
print("Разносторонний")
else:
print("Не существует")
# Вариант 2: Списки и множества (убираем дубликаты)
a, b, c = sorted([a, b, c]) # Сортировка упрощает проверку существования
if a + b > c:
unique_sides = len({a, b, c})
if unique_sides == 1: print("Равносторонний")
elif unique_sides == 2: print("Равнобедренный")
else: print("Разносторонний")
else:
print("Не существует")
# Вариант 3: Itertools и кванторы
from itertools import permutations
# Проверяем неравенство треугольника для всех перестановок
if all(x + y > z for x, y, z in permutations([a, b, c], 3)):
# Считаем количество пар равных сторон
equal_pairs = sum(1 for x, y in permutations([a, b, c], 2) if x == y)
if equal_pairs == 6: print("Равносторонний") # Все равны
elif equal_pairs > 0: print("Равнобедренный")
else: print("Разносторонний")
3. Эпидемия на корабле (флаги vs кванторы).
Есть список температур. Определить статус: "Все здоровы", "Все больны", "Есть и те, и те".
(Лекция 1)
T = [36.6, 37.5, 36.6] # Пример данных
# Вариант 1: Флаги
has_sick = False
has_healthy = False
for t in T:
if t > 37: has_sick = True
else: has_healthy = True
if has_sick and has_healthy: print("И больные, и здоровые")
elif has_sick: print("Все больны")
else: print("Все здоровы")
# Вариант 2: Кванторы
is_sick_list = [t > 37 for t in T] # Список булевых значений
if all(is_sick_list): print("Все больны")
elif any(is_sick_list): print("И больные, и здоровые") # Если не все (проверено выше), но кто-то есть
else: print("Все здоровы")
4. Палиндром (перебор vs подсчет букв).
Можно ли из букв строки составить палиндром?
(Лекция 2)
s = "aabbc"
# Вариант 1: Перебор (медленно, itertools) - только проверка факта
from itertools import permutations
found = False
for p in permutations(s):
word = "".join(p)
if word == word[::-1]:
found = True
break
print("Можно" if found else "Нельзя")
# Вариант 2: Подсчет (эффективно)
# Палиндром можно составить, если букв с нечетным количеством <= 1
odd_counts = sum(1 for char in set(s) if s.count(char) % 2 == 1)
print("Можно" if odd_counts <= 1 else "Нельзя")
5. Магический квадрат (рекуррентные формулы vs множества/кванторы).
Равна ли сумма чисел по строкам, столбцам и диагоналям?
(Лекция 2)
M = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
n = len(M)
# Вариант 1: Рекуррентные формулы (циклы и флаг)
is_magic = True
target_sum = sum(M[0]) # Сумма первой строки как эталон
# Проверка строк
for i in range(n):
if sum(M[i]) != target_sum: is_magic = False
# ... (аналогичные циклы для столбцов и диагоналей с флагом is_magic)
# Вариант 2: Множества и кванторы (однострочник)
# Собираем все суммы в множество. Если длина множества == 1, то все суммы равны.
sums = {
sum(M[i][i] for i in range(n)), # Главная диагональ
sum(M[i][n-1-i] for i in range(n)) # Побочная диагональ
}
sums |= {sum(row) for row in M} # Строки (объединение множеств)
sums |= {sum(M[r][c] for r in range(n)) for c in range(n)} # Столбцы
print("Магический" if len(sums) == 1 else "Обычный")
6. Решето Эратосфена.
Поиск простых чисел до N.
(Лекция 3)
n = 30
# Создаем "табличку" (список), изначально заполненную числами
L = list(range(n + 1))
L[1] = 0 # 1 не простое
for i in range(2, n + 1):
if L[i] != 0: # Если число не вычеркнуто
# Вычеркиваем (зануляем) все кратные начиная с i*i
for j in range(i * i, n + 1, i):
L[j] = 0
# Собираем оставшиеся ненулевые числа
primes = [x for x in L if x != 0]
print(primes)
7. Рекурсивные функции (Факториал, Фибоначчи).
(Лекция 4)
def fact(n):
if n == 1: return 1
return n * fact(n - 1)
def fib(n):
if n <= 2: return 1
return fib(n - 1) + fib(n - 2)
8. Числа Фибоначчи через список и скользящее окно.
(Лекция 4)
# Через список (память O(N))
def fib_list(n):
L = [0, 1, 1]
for i in range(3, n + 1):
L.append(L[-1] + L[-2])
return L[n]
# Скользящее окно (память O(1))
def fib_window(n):
a, b = 1, 1
for _ in range(3, n + 1):
a, b = b, a + b # Обмен и сложение
return b
9. Быстрое возведение в степень.
Рекурсивный алгоритм $O(\log N)$.
(Лекция 4)
def power(a, n):
if n == 0: return 1
if n % 2 == 0:
# Если степень четная: a^n = (a^2)^(n/2)
return power(a * a, n // 2)
else:
# Если нечетная: a^n = a * a^(n-1)
return a * power(a, n - 1)
10. Классы (Точка, Отрезок, Человек).
(Лекции 7, 8)
class Point:
def __init__(self, x=0, y=0):
self.x, self.y = x, y
class Segment:
def __init__(self, p1, p2):
self.p1, self.p2 = p1, p2
def length(self):
return ((self.p1.x - self.p2.x)**2 + (self.p1.y - self.p2.y)**2)**0.5
class Person:
def __init__(self, name, year):
self.name = name
self.year = year
@property
def age(self): # Вычисляемое свойство
return 2025 - self.year